
/**
  ******************************************************************************
* @file				booter.c
* @author			ou_teki
* @encoding			UTF-8 
* @date				2024-0420
  ******************************************************************************
  */

#ifdef __cplusplus
extern "C" {
#endif

#include "booter.h"



//-TKW24-1112-关闭全局中断
__STATIC_INLINE void  ENABLE_INT(void)
{
    __enable_irq();
}

__STATIC_INLINE void DISABLE_INT(void)
{
    __disable_irq();
}

//-TKW24-1112-使能全局中断
__STATIC_INLINE void DISABLE_Systick(void)
{
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
}

//-TKW24-1112-清除中断标志位
__STATIC_INLINE void CLEAR_INT_FLAG(void)
{
	uint8_t i = 0;  //-TKX24-1109-存在bug隐患-与inline有关
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i]=0xFFFFFFFF;
        NVIC->ICPR[i]=0xFFFFFFFF;
    }    
}


typedef void (*JTP_FT)(void);
//-TKW24-1112-从APP回到BOOTER只需要单片机(全面)复位即可
//-TKX24-1112-或使用该函数跳转到boot对应的地址
void JumpToApp(volatile uint32_t addr)
{
    /* 设置所有时钟到默认状态，使用HSI时钟 */
    //HAL_RCC_DeInit();

    /* 关闭全局中断 */
    DISABLE_INT(); 
    /* 关闭滴答定时器，复位到默认值 */
    DISABLE_Systick();
    /* 关闭所有中断，清除所有中断挂起标志 */
    CLEAR_INT_FLAG();

    /*  使能全局中断 
        MCU在上电后默认总中断的相应是使能的，
        为了进一步处理中断请求并继续系统的正常运行，
        需要重新使能系统对于中断的相应。*/
    ENABLE_INT(); //-TKX24-1112-    

    /* 跳转到系统BootLoader，首地址是MSP，地址+4是复位中断服务程序的地址 */
    JTP_FT SysMemBootJump = (JTP_FT)*(volatile uint32_t *)(addr + 4);
    /* 设置主堆栈指针 */
    __set_MSP(*(uint32_t *)addr);
    /* 在RTOS工程，这条语句很重要，设置为特权级模式，使用MSP指针 */
    __set_CONTROL(0);
    /* 设置中断向量表 */
    SCB->VTOR = addr;

    /* 跳转到系统BootLoader */
    SysMemBootJump(); 

    /* 跳转成功的话，不会执行到这里，可以在这里添加代码 */
    while (1)
    {

    }
}




#ifdef __cplusplus
}
#endif
